﻿using System;
using System.Collections.Generic;
using Entidades;
using log4net;
using NHibernate;


namespace AccesoDatos.DAO
{
    public class DaoMaquina:IDAO.IDaoMaquina
    {
        protected static readonly ILog log = LogManager.GetLogger(typeof(DaoMaquina));


        public IList<MaquinaApuesta> SeleccionarTodos()
        {
            try{
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionTodos de maquina");
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from MaquinaApuesta");
                IList<MaquinaApuesta> retorna = (IList<MaquinaApuesta>)query.List<MaquinaApuesta>();
                sesion.Transaction.Commit();
                log.Info("Se retorna con éxito la lista de maquinas");
                
                }catch(ADOException exception)
                {
                    log.Error("Error al seleccionar todas las maquinas");
                    log.Error(exception.Message);
                }

            return null;
        }

        public MaquinaApuesta SeleccionarPorId(int id)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionarPorId recibiendo el id: "+id);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                MaquinaApuesta busqueda = (MaquinaApuesta) sesion.Get(typeof (MaquinaApuesta), id);
                sesion.Transaction.Commit();
                log.Info("Maquina retornada con éxito");
                return busqueda;
            }catch(ADOException exception)
            {
                log.Error("Error al retornar la maquina bajo el id: "+id);
                log.Error(exception.Message);
            }
            return null;
        }

        public void Insertar(MaquinaApuesta c)
        {
            log4net.Config.XmlConfigurator.Configure();
            log.Info("Entra en insertar con los valores: "+c.Latitud+ c.Longitud+ c.Pais+c.Ciudad+c.Estado+c.Status);
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            ITransaction transaccion = null;
            try
            {
                transaccion = sesion.BeginTransaction();
                sesion.Save(c);
                transaccion.Commit();
                sesion.Flush();
                log.Info("Maquina insertada con éxito");

            }
            catch (Exception exception)
            {
                exception.GetBaseException();
                if (transaccion != null)
                {
                    log.Error("No se puedo insertar la maquina " + c.Idmaquina);
                    log.Error(exception.Message);
                    transaccion.Rollback();
                    throw;
                }
            }

        }

      public void Modificar(MaquinaApuesta c)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("entra en modificar con los parametros: "+c.Pais+c.Estado+c.Ciudad+c.Latitud+c.Longitud);
                ConfiguracionNHibernate.CloseSession();
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                sesion.Update(c);
                sesion.Transaction.Commit();
                log.Info("Maquina modificada con exito");
            }catch(ADOException exception)
            {
                log.Error("No se pudo modificar la maquina");
                log.Info(exception.Message);
            }
        }

      public void EliminarPorId(int id)
      {
          try
          {
                  log4net.Config.XmlConfigurator.Configure();
                  log.Info("entra en eliminar bajo el id: "+id);
                  ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                  sesion.BeginTransaction();
                  sesion.Delete((MaquinaApuesta)sesion.Get(typeof(MaquinaApuesta), id));
                  sesion.Transaction.Commit();
                  log.Info("Maquina eliminada");
              }catch(ADOException exception)
              {
                  log.Error("error al eliminar maquina");
                  log.Error(exception.Message);
              }
      }

        public IList<MaquinaApuesta> SeleccionarPorParametro(string parametro, string valor)
        {
            try
            {
                    log4net.Config.XmlConfigurator.Configure();
                    log.Info("entra en seleccionar por parametro recibiendo: parametro: "+ parametro+"valor:"+valor);
                    ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                    sesion.BeginTransaction();
                    IQuery query = sesion.CreateQuery("from MaquinaApuesta where " + parametro + " = '" + valor + "'");
                    IList<MaquinaApuesta> retorna = (IList<MaquinaApuesta>)query.List<MaquinaApuesta>();
                    sesion.Transaction.Commit();
                    log.Info("Maquinas retornadas con éxito");
                    return retorna;
                }catch(ADOException exception)
                {
                    log.Error("no se pudo retornar las maquinas bajo esas condiciones");
                    log.Info(exception.Message);
                }
            return null;
        }

        public IList<MaquinaApuesta> SeleccionarPorParametro(string parametro, int valor)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("entra en seleccionar por parametro recibiendo: parametro: " + parametro + "valor:" + valor);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from MaquinaApuesta where " + parametro + " = '" + valor + "'");
                IList<MaquinaApuesta> retorna = (IList<MaquinaApuesta>)query.List<MaquinaApuesta>();
                sesion.Transaction.Commit();
                log.Info("Maquinas retornadas con éxito");
                return retorna;
            }
            catch (ADOException exception)
            {
                log.Error("no se pudo retornar las maquinas bajo esas condiciones");
                log.Info(exception.Message);
            }
            return null;
        }

      

        public IList<MaquinaApuesta> ListarMaquinasActivas()
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en lista maquinas activas");
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from MaquinaApuesta where " + "STATUS" + " = " + 1);
                IList<MaquinaApuesta> retorna = (IList<MaquinaApuesta>) query.List<MaquinaApuesta>();
                sesion.Transaction.Commit();
                log.Info("Maquinas activas retornadas con exito");
                return retorna;
            }catch(ADOException exception)
            {
                log.Error("no pueden retornarse maquinas activas");
                log.Error(exception.Message);
                
            }
            return null;
        }
    }
}
